/*
集训第二周，搜索系列：BFS，DFS，A*，IDA*和舞蹈链算法

IDA*的学习，经典问题：八数码难题
参考模板：https://www.luogu.com.cn/blog/niiick/solution-p1379

*/

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;

const int maxn=15;
int k,judge;
int mp[5][5];
int ans[4][4]=
{{0,0,0,0},
 {0,1,2,3},
 {0,8,0,4},
 {0,7,6,5}};//最终状态，因此可使用DFS或者BFS

//状态数组
int dx[]={0,1,-1,0};
int dy[]={1,0,0,-1};

int check()
{
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            if(mp[i][j]!=ans[i][j])return 0;
    return 1;
}

int test(int step)
{
    int cnt=0;
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            if(mp[i][j]!=ans[i][j])
            {
                if(++cnt+step>k)return 0;//若当前步数+估价函数值>枚举的最大步数 则直接返回
            }
    return 1;
}

void A_star(int step,int x,int y,int pre)
{
    if(step==k){if(check())judge=1;return;}
    if(judge)return ;
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i],ny=y+dy[i];
        if(nx>=1&&nx<=3&&ny>=1&&ny<=3&&pre+i!=3)//最优性剪枝。`pre+i!=3`必须有，不然只能对一半。
        {
            swap(mp[x][y],mp[nx][ny]);
            if(test(step)&&!judge)A_star(step+1,nx,ny,i);
            swap(mp[x][y],mp[nx][ny]);//找不到结果，恢复状态
        }


    }
}

int main()
{
    char ss[maxn];
    scanf("%s",ss);
    int x,y;
    for(int i=0;i<9;i++)
    {
        mp[i/3+1][i%3+1]=ss[i]-'0';
        if(ss[i]-'0'==0)x=i/3+1,y=i%3+1;//出发点
    }
    if(check()){printf("0\n");return 0;}
    while(++k)
    {
        A_star(0,x,y,-1);
        if(judge){printf("%d\n",k);break;}
    }
    return 0;
}
